package com.mvvm.start.main.mvvm.m

import androidx.lifecycle.LiveData
import androidx.paging.*
import com.mvvm.start.main.api.GitHubService
import com.mvvm.start.main.bean.result.Repo

/**
 * @功能: paging分页加载
 * @User Lmy
 * @Creat 2021/11/1 10:38 上午
 * @Compony 永远相信美好的事情即将发生
 */
object PagingRepository {
    val PAGE_SIZE = 50
    private val gitHubService = GitHubService.create()
    fun getPagingData(): LiveData<PagingData<Repo>> {
        return Pager(
            config = PagingConfig(PAGE_SIZE),
            pagingSourceFactory = { RepoPagingSource(gitHubService) }
        ).liveData
    }
}

/**
 * @功能: 在继承 PagingSource 时需要声明两个泛型类型，
 * 第一个 表示页数的数据类型，
 * 第二个 每一项数据所对应的对象类型（注意不是每一页）
 * @User Lmy
 * @Creat 2021/11/1 11:54 上午
 * @Compony 永远相信美好的事情即将发生
 */
class RepoPagingSource(private val gitHubService: GitHubService) : PagingSource<Int, Repo>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repo> {
        return try {
            //先通过 params 参数得到 key，注意 key是可能为null的 为 null 的话我们就默认将当前页数设置为第一页
            val page = params.key ?: 1
            // 通过 params 参数得到 loadSize，表示每一页包含多少条数据，
            val pageSize = params.loadSize
            //调用接口请求数据
            val repoResponse = gitHubService.searchRepos(page, pageSize)
            //数据列表
            val repoItems = repoResponse.items
            //如果当前页已经是第一页或最后一页，那么它的上一页或下一页就为 null。
            val prevKey = if (page > 1) page - 1 else null
            val nextKey = if (repoItems.isNotEmpty()) page + 1 else null
            /**
             *调用 LoadResult.Page() 函数，构建一个 LoadResult 对象并返回。
             * 第一个参数传入从响应数据解析出来的 Repo列表即可，
             * 第二和第三个参数分别对应着上一页和下一页的页数。针对于上一页和下一页，
             */
            LoadResult.Page(repoItems, prevKey, nextKey)
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }

    override fun getRefreshKey(state: PagingState<Int, Repo>): Int? = null

}
